package co.edu.udea.iw.prestamos.util.seguridad;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.stereotype.Service;

import co.edu.udea.iw.prestamos.modelo.dao.UsuarioDAO;
import co.edu.udea.iw.prestamos.modelo.dto.Rol;
import co.edu.udea.iw.prestamos.modelo.dto.Usuario;
import co.edu.udea.iw.prestamos.util.exception.UserNotFoundException;
import co.edu.udea.iw.prestamos.util.logger.Log;

/**
 * Permite gestionar la autorizacion de un usuario a la aplicacion
 * @author Dave Rivera <daverivera90@gmail.com>
 * @since 7-7-2014
 * @version 1.0
 */
@Configurable
@Service("autorizacion")
public class Autorizacion {
	
	/**
	 * Inyeccion de dependencias
	 */
	@Autowired
	private UsuarioDAO usuarioDao;
	
	/**
	 * Variable para extraer facilmente la descripcion de el Rol Administrador
	 */
	public static final String ROLE_ADMIN = "Admin";
	
	/**
	 * Variable para extraer facilmente la descripcion de el Rol Manager
	 */
	public static final String ROLE_INVESTIGADOR = "Investigador";
	
	/**
	 * Permite verificar si un usuario tiene permisos para continuar con alguna funcionalidad.
	 * 
	 * @param roles    Roles a los cuales se les concede el permiso
	 * @param username Nombre de usuario
	 * @param role     Rol del usuario
	 * @return         True si el usuario no tiene autorizacion de seguir, False de lo contrario 
	 * @throws NullPointerException Excepcion lanzada cuando la lista de roles es de tipo null
	 */
	public boolean isNotAuthorized(Set<String> roles, String username, String role) throws NullPointerException{

		if (roles == null)
			throw new NullPointerException();
		
		try {
			Usuario usuario = usuarioDao.obtenerUsuarioPorUsername(username);
			Rol rol = usuario.getRol();
			
			// If the role is different, the access is denied
			if ( rol.getDescripcion().compareTo(role) != 0)
				return true;

			// If role is in the set, the access is granted 
			if (roles.contains(role))
				return false;
			
		} catch (UserNotFoundException e) {
			Log.log(getClass(), "El usuario no se ha encontrado: " + username, Log.ERROR, e);
		}
		
		return true;
	}

}
